#include "LinkTree.h"
#include <stdio.h>
#include <dirent.h>
#include<stdlib.h>
#include<string.h>
void ExploereDirectory(const char *path, LTNode *parentNode)//递归地遍历文件夹//一个是文件夹路径 path，另一个是父节点 parentNode。
{
    DIR *dir = opendir(path);//打开指定路径的文件夹，并判断是否打开成功。打开失败则直接返回。
    if (dir == NULL)
        return;
    
    struct dirent *entry = readdir(dir);
    while ((entry = readdir( dir)) != NULL)//读取文件夹中的条目，并进行循环遍历。
    {
        if (strcmp(entry->d_name,".") == 0 || strcmp(entry->d_name,"..")==0)
            continue;//判断当前条目的名称是否为 “.” 或 “…”，如果是则跳过该条目，继续下一个。

        LTNode *fileNode = CreateTreeNode(entry->d_name);//创建一个新的树节点 fileNode，其名称为当前条目的名称。
        ConnectBranch(parentNode,fileNode);//使用 ConnectBranch 函数将其连接到父节点 parentNode 上。

        if(entry->d_type == 4)
        {
            char filePath[100] = {0};//定义一个字符数组 filePath，大小为100，并初始化为全0。
            strcpy(filePath,path);//使用 strcpy 函数将 path 的内容复制到 filePath 中，这样 filePath 中就存储了父文件夹的路径。
            strcat(filePath,"/");//使用 strcat 函数将 / 字符串追加到 filePath 后面，将父文件夹路径和文件名之间连接起来。
            strcat(filePath,entry->d_name);//再次使用 strcat 函数将当前条目的名称 entry->d_name 追加到 filePath 中，形成完整的子文件夹路径。
            ExploereDirectory(filePath,fileNode);//最后调用 ExploereDirectory 函数，以新构建的 filePath 和当前的子文件夹节点 fileNode 作为参数进行递归调用。
        }//递归调用 ExploereDirectory 函数，将新构建的路径 filePath 和新创建的节点 fileNode 作为参数。

    }
    closedir(dir);//关闭文件夹。
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("invalid input numbers!\n");
        return 0;
    }//检查命令行参数个数是否为2，不为2则打印错误信息并返回。

    LTree FileTree;
    InitLTree(&FileTree);//初始化一个表示文件树的变量 FileTree。

    FileTree.root->data=argv[1];
    ExploereDirectory(argv[1],FileTree.root);//调用 ExploereDirectory 函数开始遍历指定路径，并将根节点作为参数传入
    Travel(&FileTree);
    return 0;
}